package com.kehongborui.fliggy.interceptor;

import com.kehongborui.fliggy.annotation.Permission;
import com.kehongborui.fliggy.entity.User;
import com.kehongborui.fliggy.enums.LOGIN_USER;
import com.kehongborui.fliggy.enums.Role;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import static com.kehongborui.fliggy.enums.Role.ROLE;
import static com.kehongborui.fliggy.enums.Role.VISITOR;

/**
 * @author zhang peng yang ming
 * @CopyRight (C) http://www.csdn.com
 * @brief 当前拦截器用于注解实现权限，不能与拦截器实现权限的方式所对应的拦截器类
 * {@link AuthenticationInterceptor com.kehongborui.fliggy.interceptor.AuthenticationInterceptor}
 * 以及 {@link CurrentModuleInterceptor com.kehongborui.fliggy.interceptor.CurrentModuleInterceptor}
 * 同时存在
 * @email 122162005@qq.com
 * @date 2018-09-13
 */
public class PermissionInterceptor extends HandlerInterceptorAdapter {
    @Override
    public boolean preHandle(HttpServletRequest request,
                             HttpServletResponse response, Object handler) throws Exception {
        // 判断handler是否是方法
        if (handler instanceof HandlerMethod) {
            // 通过HandlerMethod 对应获取方法上对应的权限注解
            Permission permission = ((HandlerMethod) handler).getMethodAnnotation(Permission.class);
            // 判断方法上权限注解对应的角色
            if (permission == null || permission.permits().length == 0) {
                return true;
            } else {
                // 权限注解指定了角色
                // 获取登录用户信息
                User loginUser = (User)request.getSession().getAttribute(LOGIN_USER.USER.name());
                // 获取权限对应的角色
                Role[] permits = permission.permits();

                // 遍历权限对应的角色，判断用户对应的角色是否在权限当中
                for (Role role : permits) {
                    // 1.如果用户没有登录 同时 权限允许以游客身份登录即permits中有(VISITOR)，则放行
                    // 2.用户已经登录   同时  用户的角色在权限范围之内，则放行
                    if ((loginUser == null && role.equals(VISITOR)) ||
                            (loginUser != null && ROLE(loginUser.getRoleId()).equals(role))) {
                        return true;
                    }
                }
                // 如果for 循环结束仍然没有放行，这个地方就该返回false
                return false;
            }
        }

        return true;
    }
}
